import os
from rest_framework.views import APIView
from .serializers import UploadImageSerializer
from rest_framework import status
from rest_framework.response import Response
from shortuuid import uuid
from django.conf import settings


class UploadImageView(APIView):

    def post(self, request):
        # 1.图片是xx.png。(用户可以把xx.py → xx.png，然后再把文件名改回来，进行攻击)
        # 2..png/.jpg/.jpeg, .txt/ .py
        serializer = UploadImageSerializer(data=request.data)
        if serializer.is_valid():
            # 获取序列化中合格、被清洗过的数据"image"
            file = serializer.validated_data.get('image')
            # abc.png => sdfsdafsdjag + '.png'
            # os.path.splitext（'abc.png'） = （'abc'，'.png'）
            # 令文件名 = uuid + 原文件后缀名(防止黑客使用文件名进行攻击)
            filename = uuid() + os.path.splitext(file.name)[-1]
            # 设置文件的保存路径
            path = settings.MEDIA_ROOT / filename

            try:
                # 打开文件进行保存
                with open(path, 'wb') as fp:
                    # 逐块进行保存
                    for chunk in file.chunks():
                        fp.write(chunk)
            except Exception:
                # 如果保存异常，则返回此数据，据wangEditor中的说明
                return Response({"errno": 1,  # 只要不等于 0 就行
                                 "message": "图片保存失败"})

            # 获取文件的URL：abc.png => /media/abc.png
            file_url = settings.MEDIA_URL + filename

            # 如果保存成功，则返回此数据，据wangEditor中的说明
            return Response({"errno": 0,  # 注意：值是数字，不能是字符串
                             "data": {"url": file_url,  # 图片 src ，必须
                                      "alt": "",  # 片描述文字，非必须
                                      "href": file_url  # 图片的链接，非必须
                                      }})

        else:
            print(serializer.errors)
            return Response({
                "errno": 1, # 只要不等于 0 就行
                "message": list(serializer.errors.values())[0][0]
            })
